package Q5_03_Flip_Bit_to_Win; public class QuestionC { public static int SEQUENCE_LENGTH = 32; /* Given set of three sequences ordered as {0s, then 1s, then 0s}, * find max sequence that can be formed. */ public static int getMaxSequence(int[] sequences) { /* 1s, then 0s, then [old] ones */ if (sequences[1] == 1) { // a single 0 -> merge sequences return sequences[0] + sequences[2] + 1; } else if (sequences[1] == 0) { // no 0s -> take one side return Math.max(sequences[0], sequences[2]); } else { // many 0s -> take side, add 1 (flip a bit) return Math.max(sequences[0], sequences[2]) + 1; } } public static void shift(int[] sequences) { sequences[2] = sequences[1]; sequences[1] = sequences[0]; sequences[0] = 0; } public static int longestSequence(int n) { int searchingFor = 0; int[] sequences = {0, 0, 0}; // Counts of last 3 sequences int maxSequence = 1; for (int i = 0; i < SEQUENCE_LENGTH; i++) { if ((n & 1) != searchingFor) { if (searchingFor == 1) { // End of 1s + 0s + 1s sequence maxSequence = Math.max(maxSequence, getMaxSequence(sequences)); } searchingFor = n & 1; // Flip 1 to 0 or 0 to 1 shift(sequences); // Shift sequences } sequences[0]++; n >>>= 1; } /* Check final set of sequences */ if (searchingFor == 0) { shift(sequences); } int finalSequence = getMaxSequence(sequences); maxSequence = Math.max(finalSequence, maxSequence); return maxSequence; } public static void main(String[] args) { int original_number = Integer.MAX_VALUE; int new_number = longestSequence(original_number); System.out.println(Integer.toBinaryString(original_number)); System.out.println(new_number); } }